package com.bfsuol.bfsuolframework.security;

import com.bfsuol.bfsuolframework.core.configuration.ConfigUtils;
import com.bfsuol.bfsuolframework.core.synchronization.SyncGroup;
import com.bfsuol.bfsuolframework.core.utils.StringUtils;
import org.apache.log4j.Logger;

public class SecuritySynchronization {

	protected final Logger logger = Logger.getLogger(getClass());
	
	private SecuritySyncGroup securitySyncGroup = null;
	private static SecuritySynchronization instance = new SecuritySynchronization();
	
	private SecuritySynchronization(){
		String group=ConfigUtils.get("security.SECURITY_SYNC_GROUP");
		if(StringUtils.isBlank(group)){
			logger.error("无法加载权限同步对象，系统未配置权限同步组参数");
			return;
		}
		//加载权限同步
		try{
			securitySyncGroup = new SecuritySyncGroup();
		}catch(Exception e){
			logger.error("无法加载权限同步对象"+e);
			securitySyncGroup = null;
		}
	}
	
	/**
	 * 广播重新加载所有权限内容
	 * @return
	 */
	public static boolean reload(){
		return send(SecuritySyncGroup.TYPE_RELOAD,null);
	}
	/**
	 * 广播重新加载全部角色菜单缓存
	 */
	public static boolean reloadRoleMenus(){
		return send(SecuritySyncGroup.TYPE_RELOAD_ROLEMENUS,null);
	}
	/**
	 * 广播重新加载单个角色菜单缓存
	 * @param roleCode 角色CODE
	 */
	public static boolean reloadRoleMenus(String roleCode){
		return send(SecuritySyncGroup.TYPE_RELOAD_ROLEMENUS_ROLECODE,roleCode);
	}
	/**
	 * 广播重新加载所有角色权限数据，包括角色权限、角色功能、角色资源
	 */
	public static boolean reloadRolePrivileges(){
		return send(SecuritySyncGroup.TYPE_RELOAD_ROLEPRIVILEGES,null);
	}
	/**
	 * 广播重新加载单个角色权限数据，包括角色权限、角色功能、角色资源
	 * @param roleCode 角色CODE
	 */
	public static boolean reloadRolePrivileges(String roleCode){
		return send(SecuritySyncGroup.TYPE_RELOAD_ROLEPRIVILEGES_ROLECODE,roleCode);
	}
	
	/**
	 * 统一发送同步消息
	 * @param type 重新加载类型
	 * @param code 对应的角色编码
	 * @return
	 */
	private static boolean send(int type, String code){
		if(instance.securitySyncGroup != null){
			instance.securitySyncGroup.custom(Long.valueOf(type), code);
			return true;
		}
		return false;
	}
	
	
	/**
	 * 内部类，实现广播的发送和接收
	 * @author 新龙
	 *
	 */
	private class SecuritySyncGroup extends SyncGroup {

		public final static int TYPE_RELOAD = 1;
		public final static int TYPE_RELOAD_ROLEMENUS = 2;
		public final static int TYPE_RELOAD_ROLEMENUS_ROLECODE = 3;
		public final static int TYPE_RELOAD_ROLEPRIVILEGES = 4;
		public final static int TYPE_RELOAD_ROLEPRIVILEGES_ROLECODE = 5;
		
		
		public SecuritySyncGroup() throws Exception{
			super(ConfigUtils.get("security.SECURITY_SYNC_GROUP"));
		}

		/**
		 * 重新从数据库中读取
		 */
		@Override
		public void execute(Long type, String code) {
			int typeValue = type==null?0:type.intValue();
			switch(typeValue){
				case TYPE_RELOAD:
					SecurityContext.reloadFromDB();
					break;
				case TYPE_RELOAD_ROLEMENUS:
					SecurityContext.reloadRoleMenusFromDB();
					break;
				case TYPE_RELOAD_ROLEMENUS_ROLECODE:
					SecurityContext.reloadRoleMenusFromDB(code);
					break;
				case TYPE_RELOAD_ROLEPRIVILEGES:
					SecurityContext.reloadRolePrivilegesFromDB();
					break;
				case TYPE_RELOAD_ROLEPRIVILEGES_ROLECODE:
					SecurityContext.reloadRolePrivilegesFromDB(code);
					break;
				default:
					SecurityContext.reloadFromDB();
			}
		}

	}
}
